LEÇON 5

Gestion des Fichiers et Exceptions en Python

Lecture/Écriture de fichiers, Gestion d'erreurs et Context Managers

Français - Fichiers et Exceptions

Pourquoi gérer les exceptions ? Les exceptions permettent de gérer les erreurs de manière élégante et d'éviter que le programme ne plante brutalement.

1. Gestion des Exceptions de Base

Python utilise les blocs try/except pour capturer et gérer les exceptions.

# Gestion d'exception simple
try:
    nombre = int(input("Entrez un nombre: "))
    resultat = 10 / nombre
    print("Résultat:", resultat)
except ZeroDivisionError:
    print("Erreur: Division par zéro impossible!")
except ValueError:
    print("Erreur: Vous devez entrer un nombre valide!")
except Exception as e:
    print(f"Une erreur inattendue s'est produite: {e}")
else:
    print("Calcul réussi!")
finally:
    print("Fin de l'opération.")
# Lever une exception personnalisée
def verifier_age(age):
    if age < 0:
        raise ValueError("L'âge ne peut pas être négatif!")
    elif age < 18:
        raise PermissionError("Vous devez avoir au moins 18 ans.")
    else:
        return True

try:
    verifier_age(-5)
except ValueError as e:
    print("Erreur:", e)

2. Création d'Exceptions Personnalisées

Vous pouvez créer vos propres exceptions pour des cas spécifiques.

# Définition d'une exception personnalisée
class SoldeInsuffisantError(Exception):
    def __init__(self, solde, montant):
        self.solde = solde
        self.montant = montant
        message = f"Solde insuffisant! Solde: {solde}, Montant demandé: {montant}"
        super().__init__(message)

class CompteBancaire:
    def __init__(self, solde_initial):
        self.solde = solde_initial

    def retirer(self, montant):
        if montant > self.solde:
            raise SoldeInsuffisantError(self.solde, montant)
        self.solde -= montant
        return self.solde

# Utilisation
compte = CompteBancaire(1000)
try:
    compte.retirer(1500)
except SoldeInsuffisantError as e:
    print("Erreur bancaire:", e)

3. Lecture et Écriture de Fichiers

Mode Description
'r' Lecture seule (défaut)
'w' Écriture (écrase le fichier existant)
'a' Ajout à la fin du fichier
'x' Création exclusive (erreur si existe)
'b' Mode binaire (ex: 'rb', 'wb')
'+' Lecture et écriture (ex: 'r+', 'w+')
# Écrire dans un fichier
with open("exemple.txt", "w", encoding="utf-8") as fichier:
    fichier.write("Ligne 1\n")
    fichier.write("Ligne 2\n")
    fichier.write("Ligne 3\n")
    fichier.writelines(["Ligne 4\n", "Ligne 5\n"])
print("Fichier écrit avec succès!")

# Lire un fichier ligne par ligne
with open("exemple.txt", "r", encoding="utf-8") as fichier:
    print("Contenu du fichier:")
    for ligne in fichier:
        print(ligne.strip()) # strip() enlève les sauts de ligne

# Lire tout le contenu d'un coup
with open("exemple.txt", "r", encoding="utf-8") as fichier:
    contenu = fichier.read()
    print("\nContenu complet:")
    print(contenu)
Meilleure pratique : Toujours utiliser with open() pour gérer les fichiers. Cela garantit que le fichier est correctement fermé même en cas d'erreur.

4. Fichiers JSON et CSV

Python dispose de modules pour travailler avec des formats de fichiers courants.

# Travailler avec des fichiers JSON
import json

# Données à sauvegarder
donnees = {
    "nom": "Alice",
    "age": 25,
    "ville": "Paris",
    "competences": ["Python", "JavaScript", "SQL"]
}

# Écrire dans un fichier JSON
with open("donnees.json", "w", encoding="utf-8") as fichier:
    json.dump(donnees, fichier, indent=4, ensure_ascii=False)

# Lire un fichier JSON
with open("donnees.json", "r", encoding="utf-8") as fichier:
    donnees_chargees = json.load(fichier)
    print("Données chargées:", donnees_chargees)
    print("Nom:", donnees_chargees["nom"])
# Travailler avec des fichiers CSV
import csv

# Écrire dans un fichier CSV
donnees_etudiants = [
    ["Nom", "Age", "Note"],
    ["Alice", "25", "A"],
    ["Bob", "22", "B"],
    ["Claire", "24", "A+"]
]

with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier:
    writer = csv.writer(fichier)
    writer.writerows(donnees_etudiants)

# Lire un fichier CSV
with open("etudiants.csv", "r", encoding="utf-8") as fichier:
    reader = csv.reader(fichier)
    for ligne in reader:
        print(ligne)
Attention : Les fichiers CSV peuvent contenir des virgules dans les données. Utilisez le module csv pour gérer correctement ces cas.

English - File Handling and Exceptions

Why handle exceptions? Exceptions allow handling errors gracefully and prevent programs from crashing abruptly.

1. Basic Exception Handling

Python uses try/except blocks to catch and handle exceptions.

# Simple exception handling
try:
    number = int(input("Enter a number: "))
    result = 10 / number
    print("Result:", result)
except ZeroDivisionError:
    print("Error: Cannot divide by zero!")
except ValueError:
    print("Error: You must enter a valid number!")
except Exception as e:
    print(f"An unexpected error occurred: {e}")
else:
    print("Calculation successful!")
finally:
    print("End of operation.")
# Raising a custom exception
def check_age(age):
    if age < 0:
        raise ValueError("Age cannot be negative!")
    elif age < 18:
        raise PermissionError("You must be at least 18 years old.")
    else:
        return True

try:
    check_age(-5)
except ValueError as e:
    print("Error:", e)

2. Creating Custom Exceptions

You can create your own exceptions for specific cases.

# Defining a custom exception
class InsufficientBalanceError(Exception):
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        message = f"Insufficient balance! Balance: {balance}, Amount requested: {amount}"
        super().__init__(message)

class BankAccount:
    def __init__(self, initial_balance):
        self.balance = initial_balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientBalanceError(self.balance, amount)
        self.balance -= amount
        return self.balance

# Usage
account = BankAccount(1000)
try:
    account.withdraw(1500)
except InsufficientBalanceError as e:
    print("Bank error:", e)

3. Reading and Writing Files

Mode Description
'r' Read only (default)
'w' Write (overwrites existing file)
'a' Append to end of file
'x' Exclusive creation (error if exists)
'b' Binary mode (e.g., 'rb', 'wb')
'+' Read and write (e.g., 'r+', 'w+')
# Writing to a file
with open("example.txt", "w", encoding="utf-8") as file:
    file.write("Line 1\n")
    file.write("Line 2\n")
    file.write("Line 3\n")
    file.writelines(["Line 4\n", "Line 5\n"])
print("File written successfully!")

# Reading a file line by line
with open("example.txt", "r", encoding="utf-8") as file:
    print("File content:")
    for line in file:
        print(line.strip()) # strip() removes newline characters

# Reading entire content at once
with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print("\nComplete content:")
    print(content)
Best practice: Always use with open() to handle files. This ensures the file is properly closed even if an error occurs.

4. JSON and CSV Files

Python has modules for working with common file formats.

# Working with JSON files
import json

# Data to save
data = {
    "name": "Alice",
    "age": 25,
    "city": "Paris",
    "skills": ["Python", "JavaScript", "SQL"]
}

# Write to JSON file
with open("data.json", "w", encoding="utf-8") as file:
    json.dump(data, file, indent=4, ensure_ascii=False)

# Read JSON file
with open("data.json", "r", encoding="utf-8") as file:
    loaded_data = json.load(file)
    print("Loaded data:", loaded_data)
    print("Name:", loaded_data["name"])
# Working with CSV files
import csv

# Write to CSV file
student_data = [
    ["Name", "Age", "Grade"],
    ["Alice", "25", "A"],
    ["Bob", "22", "B"],
    ["Claire", "24", "A+"]
]

with open("students.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(student_data)

# Read CSV file
with open("students.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)
Warning: CSV files can contain commas within data. Use the csv module to properly handle these cases.